package com.robertux.leaderboard.util.gestoresModelos;

import java.io.ByteArrayOutputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Properties;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.TypedQuery;

import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;

import com.robertux.leaderboard.beans.entities.ProgresoMeta;
import com.robertux.leaderboard.beans.entities.Usuario;
import com.robertux.leaderboard.beans.entities.external.Sucursal;
import com.robertux.leaderboard.util.ExcelHelper;

public class GestorProgresos extends GestorEntidades<ProgresoMeta> {
	private Connection conn;
	private String detalleProgresosUsuarioQry, detalleProgresosSucursalQry,
			totalProgresosUsuarioQry, totalProgresosSucursalQry;
	
	private Calendar cal = new GregorianCalendar();
	private DateFormat dFmt = new SimpleDateFormat("MM / yyyy");
	private Logger logger;
	
	public GestorProgresos(EntityManager eMgr, Properties props) {
		super(eMgr);
		this.logger = Logger.getLogger(this.getClass());
		try {
			this.getEntityManager().getTransaction().begin();
			this.conn = this.getConnection(props);
			
			this.detalleProgresosUsuarioQry = "SELECT * FROM LEADERBOARD.PROGRESO_METAS_USUARIO WHERE USUARIO_ID = ";
			this.detalleProgresosSucursalQry = "SELECT * FROM LEADERBOARD.PROGRESO_METAS_SUCURSAL WHERE SUCURSAL_ID = ";
			
			this.totalProgresosUsuarioQry = "SELECT * FROM LEADERBOARD.PROGRESO_TOTAL_USUARIO WHERE USUARIO_ID = ";
			this.totalProgresosSucursalQry = "SELECT * FROM LEADERBOARD.PROGRESO_TOTAL_SUCURSAL WHERE SUCURSAL_ID = ";
			
			this.getEntityManager().getTransaction().commit();
		} catch (Exception e) {
			this.logger.error("Error tratando de inicializar los PreparedStatement: " + e.getMessage(), e);
		}
	}
	
	public GestorProgresos() {
		this(null, null);
	}
	
	public void closeConnection() {
		if(this.conn != null) {
			try { this.conn.close(); } catch (Exception e) { this.logger.warn("Error tratando de cerrar la conexion: " + e.getMessage()); }
		}
	}
	
	public List<ProgresoMeta> getProgresos(Usuario usuario) {
		TypedQuery<ProgresoMeta> qry = this.getEntityManager().createQuery("SELECT prog FROM ProgresoMeta prog WHERE prog.meta.usuario.id = :usuarioId ORDER BY prog.id", ProgresoMeta.class);
		qry.setParameter("usuarioId", usuario.getId());
		
		try {
			return qry.getResultList();
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar los progresos del usuario con Id " + usuario.getId() + ": " + e.getMessage(), e);
			return null;
		}
	}
	
	public List<ProgresoMeta> getProgresos(Usuario usuario, int anio, int mes) {
		TypedQuery<ProgresoMeta> qry = this.getEntityManager().createQuery("SELECT prog FROM ProgresoMeta prog WHERE prog.meta.usuario.id = :usuarioId AND FUNC('YEAR', prog.fecha) = :anio AND FUNC('MONTH', prog.fecha) = :mes ORDER BY prog.id", ProgresoMeta.class);
		qry.setParameter("usuarioId", usuario.getId());
		qry.setParameter("anio", anio);
		qry.setParameter("mes", mes);
		
		try {
			return qry.getResultList();
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar los progresos del usuario con Id " + usuario.getId() + ": " + e.getMessage(), e);
			return null;
		}
	}
	
	public Long getTotalProgresosCumplidos(Usuario usuario) {
		TypedQuery<Long> qry = this.getEntityManager().createQuery("SELECT COUNT(prog) FROM ProgresoMeta prog WHERE prog.valor >= 100 AND prog.meta.usuario.id = :usuarioId", Long.class);
		qry.setParameter("usuarioId", usuario.getId());
		
		try {
			return qry.getSingleResult();
		} catch (NoResultException nrE) {
			return 0L;
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar el total de los progresos cumplidos del usuario con Id " + usuario.getId() + ": " + e.getMessage(), e);
			return 0L;
		}
	}
	
	public Long getTotalProgresosCumplidos(Usuario usuario, int anio, int mes) {
		TypedQuery<Long> qry = this.getEntityManager().createQuery("SELECT COUNT(prog) FROM ProgresoMeta prog WHERE prog.valor >= 100 AND prog.meta.usuario.id = :usuarioId AND FUNC('YEAR', prog.fecha) = :anio AND FUNC('MONTH', prog.fecha) = :mes", Long.class);
		qry.setParameter("usuarioId", usuario.getId());
		qry.setParameter("anio", anio);
		qry.setParameter("mes", mes);
		
		try {
			return qry.getSingleResult();
		} catch (NoResultException nrE) {
			return 0L;
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar el total de los progresos cumplidos del usuario con Id " + usuario.getId() + ": " + e.getMessage(), e);
			return 0L;
		}
	}
	
	public ProgresoMeta getProgreso(int progresoId) {
		return this.getEntidad("ProgresoMeta", ProgresoMeta.class, progresoId);
	}
	
	public boolean actualizarProgreso(ProgresoMeta progreso) {
		try {
			this.actualizar(progreso);
			return true;
		} catch (Exception e) {
			this.logger.error("Error tratando de actualizar el progreso: " + e.getMessage(), e);
			return false;
		}
	}
	
	public ResultSet getDetalleProgresosUsuario(int userId) {
		return this.executeQuery(this.detalleProgresosUsuarioQry + userId);
	}
	
	public ResultSet getDetalleProgresosUsuario(int userId, int anio, int mes) {
		return this.executeQuery(this.detalleProgresosUsuarioQry + userId + this.construirCondicionMes(anio, mes));
	}
	
	public ResultSet getTotalProgresosUsuario(int userId) {
		return this.executeQuery(this.totalProgresosUsuarioQry + userId);
	}
	
	public ResultSet getTotalProgresosUsuario(int userId, int anio, int mes) {
		return this.executeQuery(this.totalProgresosUsuarioQry + userId + this.construirCondicionMes(anio, mes));
	}
	
	public ResultSet getDetalleProgresosSucursal(int sucId) {
		return this.executeQuery(this.detalleProgresosSucursalQry + sucId);
	}
	
	public ResultSet getDetalleProgresosSucursal(int sucId, int anio, int mes) {
		return this.executeQuery(this.detalleProgresosSucursalQry + sucId + this.construirCondicionMes(anio, mes));
	}
	
	public ResultSet getTotalProgresosSucursal(int sucId) {
		return this.executeQuery(this.totalProgresosSucursalQry + sucId);
	}
	
	public ResultSet getTotalProgresosSucursal(int sucId, int anio, int mes) {
		return this.executeQuery(this.totalProgresosSucursalQry + sucId + this.construirCondicionMes(anio, mes));
	}
	
	public ResultSet getDetalleProgresosGeneral() {
		return this.executeQuery("SELECT * FROM LEADERBOARD.PROGRESO_METAS_GENERAL");
	}
	
	public ResultSet getDetalleProgresosGeneral(int anio, int mes) {
		return this.executeQuery("SELECT * FROM LEADERBOARD.PROGRESO_METAS_GENERAL WHERE 1 = 1 " + this.construirCondicionMes(anio, mes));
	}
	
	public ResultSet getDetalleProgresosGeneral(int supervisorId, int anio, int mes) {
		return this.executeQuery("SELECT * FROM LEADERBOARD.PROGRESO_METAS_GENERAL WHERE SUPERVISOR_ID = " + supervisorId + this.construirCondicionMes(anio, mes));
	}
	
	protected ResultSet executeQuery(String query) {
		try {
			if(this.conn == null || this.conn.isClosed()) this.conn = this.getConnection();
			this.logger.debug("Ejecutando query: " + query);
			return this.conn.createStatement().executeQuery(query);
		} catch (SQLException e) {
			this.logger.error("Error tratando de ejecutar la query: " + e.getMessage(), e);
			return null;
		}
	}
	
	protected String construirCondicionMes(int anio, int mes) {
		this.cal.set(Calendar.YEAR, anio);
		this.cal.set(Calendar.MONTH, mes-1);
		return (" AND MES = '" + this.dFmt.format(this.cal.getTime()) + "' ");
	}
	
	public byte[] generarArchivoProgresos() {
		Calendar cal = new GregorianCalendar();
		return this.generarArchivoProgresos(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1);
	}
	
	public byte[] generarArchivoProgresos(int anio, int mes) {
		HSSFWorkbook workbook = new HSSFWorkbook();
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		Sheet hoja = workbook.createSheet("Hoja 1");
		ExcelHelper.crearDefaultStyle(workbook);
		ExcelHelper.crearDefaultStyles(workbook);
		String nombreReporteEjecutar = this.getNombreReporteEjecutar(anio, mes);
		
		String[] headersInicial = new String[]{"Código emp", "Nombre del empleado", "Farmacia", "Jefe", "Med", "Sup"};
		String[] metas = new String[]{"Neurotropas", "Vitaminas", "Blisters", "Vta Sin Recarga"};
		int[] coloresMetas = new int[]{ExcelHelper.ESTILO_FONDO_GRIS, ExcelHelper.ESTILO_FONDO_ORO, ExcelHelper.ESTILO_FONDO_VERDE, ExcelHelper.ESTILO_FONDO_LAVANDA};
		String[] camposMeta = new String[]{"Venta", "Meta", "Cumplimineto", "Nota", "Peso"};
		String[] camposExamen = new String[]{"Nota", "Peso"};
		String[] camposCumplimientos = new String[]{"Cump Neurotropas", "Cump Vitaminas", "Cump Blister", "Cump Vta. Sin Recargas", "Examen", "# met de vta alcanz"};
		String[] camposPesos = new String[]{"Neurotropas", "Vitaminas", "Blisters", "Vta Sin Recarga", "Nota", "Suma pesos"};
		
		//Creación de headers
		Row rHeadersGroup = hoja.createRow(1);
		Row rHeaders = hoja.createRow(2);
		ExcelHelper.crearFilaCeldas(1, headersInicial, rHeaders, true);
		
		int posInicialMetas = 7, i = 0;
		for(String meta: metas) {
			hoja.addMergedRegion(new CellRangeAddress(1, 1, posInicialMetas, posInicialMetas+4));
			ExcelHelper.crearFilaCeldas(posInicialMetas-2, new String[]{"", "", "", "", ""}, rHeadersGroup, true);
			Cell cellHeader = ExcelHelper.crearCelda(posInicialMetas, meta, rHeadersGroup, ExcelHelper.ESTILO_DEFAULT);
			
			cellHeader.getCellStyle().setAlignment(CellStyle.ALIGN_CENTER);
			cellHeader.setCellStyle(ExcelHelper.estilosCelda.get(coloresMetas[i]));
			
			ExcelHelper.crearFilaCeldas(posInicialMetas, camposMeta, rHeaders, true, coloresMetas[i++]);
			posInicialMetas += camposMeta.length;
		}
		
		hoja.addMergedRegion(new CellRangeAddress(1, 1, posInicialMetas, posInicialMetas+1));
		ExcelHelper.crearCelda(posInicialMetas, "Examen", rHeadersGroup, ExcelHelper.ESTILO_FONDO_GRIS);
		ExcelHelper.crearCelda(posInicialMetas+1, "", rHeadersGroup, ExcelHelper.ESTILO_FONDO_GRIS);
		
		ExcelHelper.crearFilaCeldas(posInicialMetas, camposExamen, rHeaders, true, ExcelHelper.ESTILO_FONDO_GRIS);
		
		ExcelHelper.crearCelda(29, "Nota Global Individual", rHeaders, ExcelHelper.ESTILO_FONDO_AZUL_AMARILLO);
		ExcelHelper.crearCelda(30, "Nota Farmacia", rHeaders, ExcelHelper.ESTILO_FONDO_AZUL_AMARILLO);
		
		ExcelHelper.crearFilaCeldas(31, camposCumplimientos, rHeaders, true, ExcelHelper.ESTILO_DEFAULT);
		ExcelHelper.crearFilaCeldas(37, camposPesos, rHeaders, true);
		
		hoja.addMergedRegion(new CellRangeAddress(1, 1, 37, 42));
		ExcelHelper.crearCelda(37, "PESOS", rHeadersGroup, ExcelHelper.ESTILO_DEFAULT);
		
		//Creación del body
		
		try {
			GestorSucursales gSucs = new GestorSucursales();
			this.logger.info("Ejecutando query SELECT * FROM " + nombreReporteEjecutar);
			ResultSet rs = this.conn.createStatement().executeQuery("SELECT * FROM " + nombreReporteEjecutar);
			int filaIndex = 3;
			
			while(rs.next()) {
				Sucursal suc = gSucs.getSucursal(rs.getInt("FARMACIA"));
				Row rDetail = hoja.createRow(filaIndex++);
				ExcelHelper.crearCelda(1, rs.getInt("CODIGO_EMPLEADO"), rDetail, ExcelHelper.ESTILO_DEFAULT);
				ExcelHelper.crearCelda(2, rs.getString("NOMBRE_EMPLEADO"), rDetail, ExcelHelper.ESTILO_DEFAULT_ALIGN_IZQUIERDA);
				ExcelHelper.crearCelda(3, suc != null? suc.getNombre(): "(ninguna)", rDetail, ExcelHelper.ESTILO_DEFAULT);
				ExcelHelper.crearCelda(4, rs.getString("JEFE"), rDetail, ExcelHelper.ESTILO_DEFAULT);
				ExcelHelper.crearCelda(5, rs.getString("MEDICO"), rDetail, ExcelHelper.ESTILO_DEFAULT);
				ExcelHelper.crearCelda(6, rs.getString("SUPERVISOR"), rDetail, ExcelHelper.ESTILO_DEFAULT);
				
				//Neurotropas
				ExcelHelper.crearCelda(7, rs.getDouble("VENTA_NEUROTROPAS"), rDetail, rs.getInt("TIPO_NEUROTROPAS") == 1? ExcelHelper.ESTILO_FONDO_VERDE_MONEDA: ExcelHelper.ESTILO_FONDO_VERDE_CANTIDAD);
				ExcelHelper.crearCelda(8, rs.getDouble("META_NEUROTROPAS"), rDetail, rs.getInt("TIPO_NEUROTROPAS") == 1? ExcelHelper.ESTILO_FONDO_VERDE_MONEDA: ExcelHelper.ESTILO_FONDO_VERDE_CANTIDAD);
				ExcelHelper.crearCelda(9, rs.getDouble("CUMPLIMIENTO_NEUROTROPAS") / 100, rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_PORCENTAJE);
				ExcelHelper.crearCelda(10, rs.getDouble("NOTA_NEUROTROPAS"), rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_CANTIDAD);
				ExcelHelper.crearCelda(11, new Double(rs.getInt("PESO_NEUROTROPAS")) / 100, rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_PORCENTAJE);
				
				//Vitaminas
				ExcelHelper.crearCelda(12, rs.getDouble("VENTA_VITAMINAS"), rDetail, rs.getInt("TIPO_VITAMINAS") == 1? ExcelHelper.ESTILO_FONDO_VERDE_MONEDA: ExcelHelper.ESTILO_FONDO_VERDE_CANTIDAD);
				ExcelHelper.crearCelda(13, rs.getDouble("META_VITAMINAS"), rDetail, rs.getInt("TIPO_VITAMINAS") == 1? ExcelHelper.ESTILO_FONDO_VERDE_MONEDA: ExcelHelper.ESTILO_FONDO_VERDE_CANTIDAD);
				ExcelHelper.crearCelda(14, rs.getDouble("CUMPLIMIENTO_VITAMINAS") / 100, rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_PORCENTAJE);
				ExcelHelper.crearCelda(15, rs.getDouble("NOTA_VITAMINAS"), rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_CANTIDAD);
				ExcelHelper.crearCelda(16, new Double(rs.getInt("PESO_VITAMINAS")) / 100, rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_PORCENTAJE);
				
				//Blisters
				ExcelHelper.crearCelda(17, rs.getDouble("VENTA_BLISTERS"), rDetail, rs.getInt("TIPO_BLISTERS") == 1? ExcelHelper.ESTILO_FONDO_VERDE_MONEDA: ExcelHelper.ESTILO_FONDO_VERDE_CANTIDAD);
				ExcelHelper.crearCelda(18, rs.getDouble("META_BLISTERS"), rDetail, rs.getInt("TIPO_BLISTERS") == 1? ExcelHelper.ESTILO_FONDO_VERDE_MONEDA: ExcelHelper.ESTILO_FONDO_VERDE_CANTIDAD);
				ExcelHelper.crearCelda(19, rs.getDouble("CUMPLIMIENTO_BLISTERS") / 100, rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_PORCENTAJE);
				ExcelHelper.crearCelda(20, rs.getDouble("NOTA_BLISTERS"), rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_CANTIDAD);
				ExcelHelper.crearCelda(21, new Double(rs.getInt("PESO_BLISTERS")) / 100, rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_PORCENTAJE);
				
				//Ventas sin recarga
				ExcelHelper.crearCelda(22, rs.getDouble("VENTA_VTAS_S_RECARGA"), rDetail, rs.getInt("TIPO_VTAS_S_RECARGA") == 1? ExcelHelper.ESTILO_FONDO_VERDE_MONEDA: ExcelHelper.ESTILO_FONDO_VERDE_CANTIDAD);
				ExcelHelper.crearCelda(23, rs.getDouble("META_VTAS_S_RECARGA"), rDetail, rs.getInt("TIPO_VTAS_S_RECARGA") == 1? ExcelHelper.ESTILO_FONDO_VERDE_MONEDA: ExcelHelper.ESTILO_FONDO_VERDE_CANTIDAD);
				ExcelHelper.crearCelda(24, rs.getDouble("CUMPLIMIENTO_VTAS_S_RECARGA") / 100, rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_PORCENTAJE);
				ExcelHelper.crearCelda(25, rs.getDouble("NOTA_VTAS_S_RECARGA"), rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_CANTIDAD);
				ExcelHelper.crearCelda(26, new Double(rs.getInt("PESO_VTAS_S_RECARGA")) / 100, rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_PORCENTAJE);
				
				//Examen
				ExcelHelper.crearCelda(27, rs.getDouble("NOTA_EXAMEN"), rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_CANTIDAD);
				ExcelHelper.crearCelda(28, new Double(rs.getInt("PESO_EXAMEN")) / 100, rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_PORCENTAJE);
				
				//Nota global
				double notaGlobal = rs.getDouble("NOTA_GLOBAL_INDIVIDUAL");
				Cell celdaNotaGlobal = ExcelHelper.crearCelda(29, notaGlobal, rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_CANTIDAD);
				ExcelHelper.crearCelda(30, rs.getDouble("NOTA_FARMACIA"), rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_CANTIDAD);
				
				if (notaGlobal >= 0 && notaGlobal <= 6.5) {
					celdaNotaGlobal.setCellStyle(ExcelHelper.estilosCelda.get(ExcelHelper.ESTILO_FONDO_ROJO));
				} else if (notaGlobal > 6.5 && notaGlobal <= 7.5) {
					celdaNotaGlobal.setCellStyle(ExcelHelper.estilosCelda.get(ExcelHelper.ESTILO_FONDO_ORO));
				} else if (notaGlobal > 7.5 && notaGlobal <= 8.5) {
					celdaNotaGlobal.setCellStyle(ExcelHelper.estilosCelda.get(ExcelHelper.ESTILO_FONDO_AMARILLO));
				}else {
					celdaNotaGlobal.setCellStyle(ExcelHelper.estilosCelda.get(ExcelHelper.ESTILO_FONDO_VERDE_LIMA));
				}
				
				//Cumplimientos
				ExcelHelper.crearCelda(31, rs.getDouble("CUMPLIMIENTO_NEUROTROPAS") / 100, rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_PORCENTAJE);
				ExcelHelper.crearCelda(32, rs.getDouble("CUMPLIMIENTO_VITAMINAS") / 100, rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_PORCENTAJE);
				ExcelHelper.crearCelda(33, rs.getDouble("CUMPLIMIENTO_BLISTERS") / 100, rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_PORCENTAJE);
				ExcelHelper.crearCelda(34, rs.getDouble("CUMPLIMIENTO_VTAS_S_RECARGA") / 100, rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_PORCENTAJE);
				ExcelHelper.crearCelda(35, rs.getDouble("NOTA_EXAMEN"), rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_CANTIDAD);
				
				//TODO: Contar cantidad de metas alcanzadas por ventas en base a cada cumplimiento
				ExcelHelper.crearCelda(36, (Math.floor(rs.getDouble("CUMPLIMIENTO_NEUROTROPAS") / 100) + 
						Math.floor(rs.getDouble("CUMPLIMIENTO_VITAMINAS") / 100) + 
						Math.floor(rs.getDouble("CUMPLIMIENTO_BLISTERS") / 100) + 
						Math.floor(rs.getDouble("CUMPLIMIENTO_VTAS_S_RECARGA") / 100)), rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_CANTIDAD);
				
				//Pesos
				ExcelHelper.crearCelda(37, new Double(rs.getInt("PESO_NEUROTROPAS")) / 100, rDetail, ExcelHelper.ESTILO_FONDO_VERDE_PORCENTAJE);
				ExcelHelper.crearCelda(38, new Double(rs.getInt("PESO_VITAMINAS")) / 100, rDetail, ExcelHelper.ESTILO_FONDO_VERDE_PORCENTAJE);
				ExcelHelper.crearCelda(39, new Double(rs.getInt("PESO_BLISTERS")) / 100, rDetail, ExcelHelper.ESTILO_FONDO_VERDE_PORCENTAJE);
				ExcelHelper.crearCelda(40, new Double(rs.getInt("PESO_VTAS_S_RECARGA")) / 100, rDetail, ExcelHelper.ESTILO_FONDO_VERDE_PORCENTAJE);
				ExcelHelper.crearCelda(41, new Double(rs.getInt("PESO_EXAMEN")) / 100, rDetail, ExcelHelper.ESTILO_FONDO_VERDE_PORCENTAJE);
				
				ExcelHelper.crearCelda(42, ((new Double(rs.getInt("PESO_NEUROTROPAS")) / 100) + (new Double(rs.getInt("PESO_VITAMINAS")) / 100) 
						+ (new Double(rs.getInt("PESO_BLISTERS")) / 100)  + (new Double(rs.getInt("PESO_VTAS_S_RECARGA")) / 100) 
						+ (new Double(rs.getInt("PESO_EXAMEN")) / 100)), rDetail, ExcelHelper.ESTILO_FONDO_BLANCO_VERDE_PORCENTAJE);
			}
			for(int column=1; column<=42; column++) {
				hoja.autoSizeColumn(column, true);
			}
			hoja.createFreezePane(4, 3);
			
			ExcelHelper.aplicarBordes(new CellRangeAddress(2, filaIndex-1, 1, 6), hoja, workbook);
			
			ExcelHelper.aplicarBordes(new CellRangeAddress(1, 2, 7, 11), hoja, workbook);
			ExcelHelper.aplicarBordes(new CellRangeAddress(1, filaIndex-1, 7, 11), hoja, workbook);
			
			ExcelHelper.aplicarBordes(new CellRangeAddress(1, 2, 12, 16), hoja, workbook);
			ExcelHelper.aplicarBordes(new CellRangeAddress(3, filaIndex-1, 12, 16), hoja, workbook);
			
			ExcelHelper.aplicarBordes(new CellRangeAddress(1, 2, 17, 21), hoja, workbook);
			ExcelHelper.aplicarBordes(new CellRangeAddress(3, filaIndex-1, 17, 21), hoja, workbook);
			
			ExcelHelper.aplicarBordes(new CellRangeAddress(1, 2, 22, 26), hoja, workbook);
			ExcelHelper.aplicarBordes(new CellRangeAddress(3, filaIndex-1, 22, 26), hoja, workbook);
			
			ExcelHelper.aplicarBordes(new CellRangeAddress(1, 2, 27, 28), hoja, workbook);
			ExcelHelper.aplicarBordes(new CellRangeAddress(3, filaIndex-1, 27, 28), hoja, workbook);
			
			ExcelHelper.aplicarBordes(new CellRangeAddress(2, filaIndex-1, 29, 29), hoja, workbook);
			ExcelHelper.aplicarBordes(new CellRangeAddress(2, filaIndex-1, 30, 30), hoja, workbook);
			
			ExcelHelper.aplicarBordes(new CellRangeAddress(2, 2, 31, 36), hoja, workbook);
			ExcelHelper.aplicarBordes(new CellRangeAddress(3, filaIndex-1, 31, 36), hoja, workbook);
			
			ExcelHelper.aplicarBordes(new CellRangeAddress(1, 2, 37, 42), hoja, workbook);
			ExcelHelper.aplicarBordes(new CellRangeAddress(3, filaIndex-1, 37, 42), hoja, workbook);
			
			workbook.write(out);
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar el reporte a generar en excel: " + e.getMessage(), e);
		}
		
		return out.toByteArray();
	}
	
	protected String getNombreReporteEjecutar(int anio, int mes) {
		String nombreReporte = "LEADERBOARD.REPORTE_EXCEL";
		Calendar calHoy = new GregorianCalendar(), calMesAnt = new GregorianCalendar(), calMesAnt2 = new GregorianCalendar(), calMesAnt3 = new GregorianCalendar();
		calMesAnt.add(Calendar.MONTH, -1);
		calMesAnt2.add(Calendar.MONTH, -2);
		calMesAnt3.add(Calendar.MONTH, -3);
		
		if(anio == calHoy.get(Calendar.YEAR) && mes == calHoy.get(Calendar.MONTH)+1) {
			nombreReporte = "LEADERBOARD.REPORTE_EXCEL_ACTUAL";
		} else if(anio == calMesAnt.get(Calendar.YEAR) && mes == calMesAnt.get(Calendar.MONTH)+1) {
			nombreReporte = "LEADERBOARD.REPORTE_EXCEL_ANT1";
		} else if(anio == calMesAnt2.get(Calendar.YEAR) && mes == calMesAnt2.get(Calendar.MONTH)+1) {
			nombreReporte = "LEADERBOARD.REPORTE_EXCEL_ANT2";
		} else if(anio == calMesAnt3.get(Calendar.YEAR) && mes == calMesAnt3.get(Calendar.MONTH)+1) {
			nombreReporte = "LEADERBOARD.REPORTE_EXCEL_ANT3";
		}
		
		return nombreReporte;
	}
}
